#!/usr/bin/env python
# -*- coding:utf-8 -*-


# 如果没有return语句，函数执行完毕后也会返回结果，只是结果为None。return None可以简写为return。
import functools
import math


def func(x, *arg):
    print x  # 输出参数x的值
    result = x
    print arg  # 输出通过*arg方式得到的值
    for i in arg:
        result += i
    return result


def nop():  # 空函数，使用pass占位，让代码运行
    pass


def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny  # 函数可以同时返回多个值，但其实就是一个tuple，按位置匹配


def foo(x, y, z, *args, **kargs):  # **kargs的形式收集值，会得到dict类型
    print x
    print y
    print z
    print args
    print kargs


def add(x, y):
    return x + y


def add1(x):
    x += 3
    return x


def func2():
    bars = (2, 4)  # 一种传值的方式，注意参数数量与函数的匹配
    print add(*bars)


def testlambda():
    x = 1
    y = 2
    lamb = lambda x, y: x + y
    print lamb(1, 2)


def func3():  # lambda arg1, arg2, ...argN : expression using arguments
    lamb = [lambda x: x, lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4]
    for i in lamb:
        print i(3)
    numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print map(add1, numbers)  # map(func,seq)
    print "***************************"
    list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    list2 = [9, 8, 7, 6, 5, 4, 3, 2, 1]
    print map(lambda x, y: x + y, list1, list2)  # 原来map是上下运算，reduce是横着逐个元素进行运算。
    print "***************************"
    print reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
    print "***************************"
    print filter(lambda x: x > 5, numbers)
    print [x for x in numbers if x > 5]


def partialmethod():
    int2 = functools.partial(int, base=2)
    print int2('10')


def generator01():
    L = [x * x for x in range(10)]  # 列表生成 中括号
    print L
    g = (x * x for x in range(10))  # 生成器  小括号 这种一边循环一边计算的机制，称为生成器（Generator）
    for n in g:
        print n


def auth(n, m):
    return n + m * 11


auth2 = functools.partial(auth, m=10)  # 偏函数，确定参数的默认值，降低函数调用的难度

if __name__ == '__main__':
    print func(1, 2, 3, 4, 5, 6, 7, 8, 9)  # 赋给函数的参数个数不仅仅是2个
    print "==============================="
    foo(1, 2, 3, 4, 5, name="qiwsir")
    print "==============================="
    func2()
    print "==============================="
    func3()
    print "==============================="
    partialmethod()
    print auth2(10)
    print "==============================="
    generator01()

    print '-' * 60
    testlambda()
